package com.bdqn.controller;


import com.bdqn.entity.User;
import com.bdqn.param.requset.PhoneAndCode;
import com.bdqn.service.UserService;
import com.bdqn.util.*;
import com.bdqn.util.redis.Phone_generateRedisKey;
import com.bdqn.util.redis.Reggie_Redis_Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

/**
 * <p>
 * 用户信息 前端控制器
 * </p>
 *
 * @author hunter
 * @since 2022-06-11
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private Reggie_Redis_Template redisTemplate;

    /**
     * 用户点击发送验证码 传递后台手机号 定向发送随机验证码 并存储验证码 用于登录校验
     *
     * @param user
     * @return
     * @throws Exception
     */
    @PostMapping("/sendMsg")
    public RespBean sendMsg(@RequestBody User user) throws Exception {

        log.info("前台传来的手机号为: {}", user.getPhone());
        //接收用户传来的手机号
        String phone = user.getPhone();
        if (StringUtils.isEmpty(phone)) {
            return new RespBean(ResultEnum.PHONE_ISNULL);
        } else {
            //生成随机的四位验证码
            Integer code = ValidateCodeUtils.generateValidateCode(4);
            //调用阿里的短信api 进行发送短信
//            SMSUtils.sendMessage("LTAI5tRvA4RwxVgmLd3eriG9", "dvvrOspLwLJsfqQYnCJsv5x8PImGJ6", phone, code);
            log.info("发给用户的验证码为: {}",code);
            //将生成的验证码存起来 (这里存reids) 手机号是唯一的作为key 验证码作为value
            redisTemplate.saveYZM(phone, code);
            return RespBean.ok("验证码发送成功", 1);
        }
    }

    /**
     * 通过用户输入的验证码 进行从redis查询 然后校验是否登录成功
     *
     * @param phoneAndCode
     * @return
     */
    @PostMapping("/login")
    public RespBean login(@RequestBody PhoneAndCode phoneAndCode, HttpSession session) {
        //先接收手机号
        String phone = phoneAndCode.getPhone();
        //从reids中进行查询验证码
        String yzm = redisTemplate.getYZM(phone);
        if(!StringUtils.isEmpty(yzm)) {
            if (yzm.equals(phoneAndCode.getCode())) {
                //手机号存储session  用于后期查询用户的所有地址信息  phone-->user_id-->addresses
                session.setAttribute(Constants.LOGIN_SESSION, phone);
                //判断是否为新用户   新用户-->注册   老用户-->登录
                User user = userService.selectByPhone(phone);
                if(user==null){
                    //新用户
                    userService.save(new User().setPhone(phone).setSex("男").setName("新用户").setStatus(1));
                }
                return RespBean.ok("验证码校验成功",user);
            }
        }
        return RespBean.error("验证码校验失败");

    }

    /**
     * 退出客户端  --> 销毁session
     */
    @PostMapping("/loginout")
    public RespBean loginout(HttpSession session) {
        session.invalidate();//使session无效
        return RespBean.ok("退出成功", 1);
    }
}
